<?php
/**
 * 업로드 파일 관리 클래스 
 * 
 * @package php.net
 */


/**
 * 파일 업로드 관련 클래스 
 *
 * form 에서 enctype 이 multipart/form-data 형태로 온 데이타를 조작 합니다. 
 *
 * @package php.net
 * @name Upload 
 *
 */
class Upload extends PObject {
	private $field;
	private $isArray;
	private $count;

	/**
	 * 생성자
	 * 
	 * $upload = new Upload('userfile');		// 한개 파일 업로드 할 때 
	 * $upload = new Upload('userfile', true);  // 여러개 파일 업로드 할 때 
	 *
	 * @access	public 
	 * @param	$field		string	form 에서 input type="file" 태그의 이름 
 	 * @param	$isArray	bool	false : 배열이 아님, true : 파일을 배열로 보냄 
	 *
	 */
	public function __construct($field, $isArray = false) {
		$this->field = $field;
		$this->isArray = $isArray;

		if ($isArray) {
			$this->count = count($_FILES[$field]['tmp_name']);
		} else {
			$this->count = 1;
		}
	}

	/**
	 * 파일 업로드 개수 얻어오기 
	 * 
	 * @access	public 
	 * @return	int		파일 업로드 개수 
	 *
	 */
	public function getCount()
	{
		return $this->count;
	}

	/**
	 * 업로드 된 파일 속성 얻어오기 , 몇가지 기능이 추가 됩니다. 
	 * 
	 * php에서 지원하는 파일 속성 
	 *
	 *   name		원본 파일 이름 
	 *   type		MIME Type
	 *   size		파일 크기 
	 *   tmp_name	임시파일 이름 
	 *	 error		에러코드   , 에러 코드 값은 php 메뉴얼 참조 	
	 *
	 *
	 * 확장된 속성 
	 *
	 *   filename	확장자를 제외한 파일 이름 
	 *   ext		파일 확장자 
	 *
	 * ex) 
	 *
	 * $upload = new Upload('userfile');
	 * echo $upload->get('name');
	 *
	 *
	 * 
	 * @access	public 
	 * @param	$type	string		파일 속성 (name, type, size, tmp_name, error, filename, ext)
	 * @param	$i		int			파일 순서 
	 * @return	string	각각의 타입별 속성 값 
	 *
	 */
	public function get($type, $i = 0) {
		// 파일 이름 구하기 
		if ($type == 'filename') {
			$var = explode(".", $this->get('name'));

			array_pop($var);
			return implode(".", $var);
		} 
		// 확장자 구하기 
		else if ($type == 'ext') {
			$arr = explode(".", $this->get('name', $i));
			
			return $arr[count($arr)-1];

		} 
		// 기본 속성 적용 
		else {
			if ($this->isArray) {
				return $_FILES[$this->field][$type][$i];
			} else {
				return $_FILES[$this->field][$type];
			}
		}
	}

	/**
	 * 업로드한 파일 옮기기 
	 * 
	 * @access	public 
	 * @return	int		파일 업로드 개수 
	 *
	 */
	public function move($file = '', $i = 0) {
		if ($file == '') { 
			$file = $this->get('name');
		}

		return move_uploaded_file($this->get('tmp_name', $i), $file);
	}


	/**
	 * 업로드한 파일 모두 옮기기 
	 * 
	 *
	 * @access	public 
	 * @param	@arrFile	array	옮길 파일명 리스트 
	 * @return	int		파일 업로드 개수 
	 *					0 이면 전체 업로드 성공
	 *					1 이상이면 파일 업로드 에러난 번호
	 *
	 */
	public function moveAll($arrFile = array()) {
		for ($i = 0; $i < $this->getCount(); $i++) {

			if ($this->get('tmp_name', $i) === "") {
				continue;
			}

			if (!$this->move($arrFile[$i], $i)) {
				return $i+1;
			}
		}

		return 0;
	}

	/**
	 * 업로드한 파일 해당 경로로 모두 옮기기 
	 * 
	 * $upload->moveAllUrl('/home/cyberuls/');
	 *
	 * @access	public 
	 * @param	@url	string		옮길 주소 
	 * @return	int		파일 업로드 개수 
	 *					0 이면 전체 업로드 성공
	 *					1 이상이면 파일 업로드 에러난 번호
	 *
	 */
	public function moveAllUrl($url) {
		for ($i = 0; $i < $this->getCount(); $i++) {

			if ($this->get('tmp_name', $i) === "") {
				continue;
			}

			$str = implode("/", array_push(explode("/", $url), $this->get('name',$i)));

			if (!$this->move($str, $i)) {
				return $i+1;
			}
		}

		return 0;
	}

	/**
	 * 파일 업로드 현황 보여주기 
	 * 
	 * @access	public 
	 */
	public function display() {
		echo "<pre>";
		print_r($_FILES);
		echo "<pre>";
	}
} 

?>